package com.example.ruoyivoicecall.util;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.TimeUnit;

/**
 * FFmpeg工具类，用于音频文件格式转换
 */
@Component
public class FfmpegUtil {

    @Value("${voice.call.settings.ffmpegPath}")
    private String ffmpegPath;

    /**
     * 使用FFmpeg转换音频文件格式
     * @param sourceFilePath 源文件路径
     * @return 转换后的文件路径
     * @throws IOException IO异常
     * @throws InterruptedException 线程中断异常
     * @throws RuntimeException 转换失败异常
     */
    public String convertAudioFile(String sourceFilePath) throws IOException, InterruptedException {
        // 验证源文件是否存在
        File sourceFile = new File(sourceFilePath);
        if (!sourceFile.exists() || !sourceFile.isFile()) {
            throw new IOException("源文件不存在: " + sourceFilePath);
        }

        // 验证ffmpeg路径是否有效
        if (ffmpegPath == null || ffmpegPath.trim().isEmpty() || !new File(ffmpegPath).exists()) {
            throw new IOException("FFmpeg可执行文件路径无效: " + ffmpegPath);
        }

        // 构建目标文件路径
        String fileName = sourceFile.getName();
        String directory = sourceFile.getParent();
        String fileExtension = "";
        String baseName = fileName;

        // 提取文件扩展名和基本名称
        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex > 0 && lastDotIndex < fileName.length() - 1) {
            baseName = fileName.substring(0, lastDotIndex);
            fileExtension = fileName.substring(lastDotIndex);
        }

        // 构建转换后的文件名 (在原文件名后添加_converted)
        String convertedFileName = baseName + "_converted" + fileExtension;
        String targetFilePath = directory + File.separator + convertedFileName;

        // 构建ffmpeg命令
        String[] command = {
            ffmpegPath,
            "-i", sourceFilePath,
            "-ar", "8000",  // 采样率8000Hz
            "-ac", "1",     // 单声道
            "-c:a", "pcm_alaw", // 音频编码格式为pcm_alaw
            targetFilePath
        };

        // 执行命令
        ProcessBuilder processBuilder = new ProcessBuilder(command);
        processBuilder.redirectErrorStream(true); // 合并标准输出和错误输出
        Process process = processBuilder.start();

        // 等待进程完成，设置超时时间为30秒
        boolean completed = process.waitFor(30, TimeUnit.SECONDS);

        // 检查进程是否正常完成
        if (!completed) {
            process.destroyForcibly();
            throw new RuntimeException("FFmpeg转换超时");
        }

        int exitCode = process.exitValue();
        if (exitCode != 0) {
            throw new RuntimeException("FFmpeg转换失败，退出代码: " + exitCode);
        }

        // 验证转换后的文件是否存在
        File targetFile = new File(targetFilePath);
        if (!targetFile.exists() || targetFile.length() == 0) {
            throw new RuntimeException("转换后的文件不存在或为空: " + targetFilePath);
        }

        return targetFilePath;
    }
}